home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / Writeswell Jr. 1.0.2 Master / Writeswell Jr. Source / FontMenu.c < prev    next >
Text File  |  1992-10-28  |  8KB  |  354 lines

  1. /* FontMenu.c
  2.  * Handle font and style menus in Writeswell Jr.
  3.  * ©1992 Working Software, Inc.
  4.  * This source code is copyrighted.  Permission is granted to use the Word Services
  5.  * portion of the Writeswell Jr. source code in your own programs, but you 
  6.  * may not distribute the Writeswell Jr. word-processor code as a 
  7.  * commercial product.  If you modify the code, please do not call it 
  8.  * Writeswell Jr. (or Writeswell.)  This will ensure that people understand the 
  9.  * program and don’t have to deal with a number of different versions with 
  10.  * who-knows-what going on in the code.
  11.  * 
  12.  * Writeswell Jr. and Writeswell are trademarks of Working Software, Inc.
  13.  *
  14.  * 19 May 92 Mike Crawford
  15.  */
  16.  
  17. #include <EPPC.h>
  18. #include <AppleEvents.h>
  19. #include <AEObjects.h>
  20. #include <Script.h>
  21. #include "AERegistry.h"
  22. #include "WordServices.h"
  23. #include "TestBed.h"
  24. #include "TBConstants.h"
  25. #include "Gripe.h"
  26. #include "AppEvents.h"
  27. #include "TBGlobals.h"
  28. #include "FontMenu.h"
  29. #include "OutlineButton.h"
  30.  
  31. static Style gStyleTable[] = { 0, bold, italic, underline, outline, shadow, condense, extend };
  32. static short gPointSizeTable[] = { 9, 10, 12, 14, 18, 24, 48, 72 };
  33.  
  34. Boolean DoFontMenu( short theItem )
  35. {
  36.     TEHandle    textH;
  37.     TextStyle    styleRec;
  38.     MenuHandle    fontMenu;
  39.     short        fontNum;
  40.     Str255        fontName;
  41.  
  42.     if ( !gDocWindow )
  43.         return true;
  44.         
  45.     textH = (TEHandle)GetWRefCon( gDocWindow );
  46.     
  47.     fontMenu = GetMHandle( kFontMenuID );
  48.     if ( !fontMenu )
  49.         return false;
  50.     
  51.     GetItem( fontMenu, theItem, fontName );
  52.     
  53.     GetFNum( fontName, &fontNum );
  54.     
  55.     /* Set TE to use the new font */
  56.  
  57.     styleRec.tsFont = fontNum;
  58.  
  59.     TESetStyle( doFont, &styleRec, true, textH );
  60.  
  61.     gDocDirty = true;
  62.     
  63.     return true;
  64. }
  65.  
  66. Boolean DoStyleMenu( short theItem )
  67. {
  68.     TEHandle textH;
  69.  
  70.     if ( theItem == kStMOtherPoint ){
  71.         CustomSize();
  72.         return true;
  73.     }
  74.     
  75.     gDocDirty = true;
  76.  
  77.     if ( theItem < kStMDash ){
  78.         SetStyle( theItem );
  79.         return true;
  80.     }
  81.     
  82.     SetSize( theItem );
  83.     
  84.     return true;
  85. }
  86.  
  87. void CustomSize( void )
  88. {
  89.     TextStyle    styleRec;
  90.     short        fontAscent;
  91.     short        lineHeight;
  92.     TEHandle    textH;
  93.     DialogPtr    custDlg;
  94.     short        item;
  95.     Str255        textStr;
  96.     short        kind;
  97.     Handle        h;
  98.     Rect        r;
  99.     long        num;
  100.     
  101.     if ( !gDocWindow )
  102.         return;
  103.         
  104.     textH = (TEHandle)GetWRefCon( gDocWindow );
  105.  
  106.     custDlg = GetNewDialog( kCustomSizeID, (Ptr)NULL, (WindowPtr)-1 );
  107.     if ( !custDlg )
  108.         return;
  109.     
  110.     /* Get the current size */
  111.  
  112.     TEGetStyle( (*textH)->selStart, &styleRec, &lineHeight, &fontAscent, textH );
  113.     NumToString( (long)fontAscent, textStr );
  114.     
  115.     GetDItem( custDlg, kCSEntryField, &kind, &h, &r );
  116.     SetIText( h, textStr );
  117.     
  118.     TESetSelect( 0L, 32000L, ((DialogPeek)custDlg)->textH );
  119.  
  120.     /* Set up a user proc to draw the default outline */
  121.  
  122.     GetDItem( custDlg, kCSDefUser, &kind, &h, &r );
  123.     SetDItem( custDlg, kCSDefUser, kind, (Handle)OutlineButton, &r );
  124.     
  125.     do {
  126.         ModalDialog( (ProcPtr)NULL, &item );
  127.     } while ( item != kCSCancel && item != kCSOK );
  128.     
  129.     if ( item == kCSCancel ){
  130.         DisposDialog( custDlg );
  131.         return;
  132.     }
  133.     
  134.     GetDItem( custDlg, kCSEntryField, &kind, &h, &r );
  135.     GetIText( h, textStr );
  136.     
  137.     DisposDialog( custDlg );
  138.  
  139.     StringToNum( textStr, &num );
  140.     
  141.     /* Set TE to use the new style */
  142.  
  143.     styleRec.tsSize = (short)num;
  144.  
  145.     TESetStyle( doSize, &styleRec, true, textH );
  146.  
  147.     gDocDirty = true;            /* Note that it's not dirty if we canceled */
  148.     
  149.     return;
  150. }
  151.  
  152. void SetStyle( short theItem )
  153. {
  154.     TextStyle    styleRec;
  155.     TEHandle    textH;
  156.  
  157.     if ( !gDocWindow )
  158.         return;
  159.         
  160.     textH = (TEHandle)GetWRefCon( gDocWindow );
  161.     
  162.     /* Set TE to use the new style */
  163.  
  164.     styleRec.tsFace = gStyleTable[ theItem - 1 ];
  165.  
  166.     TESetStyle( doFace, &styleRec, true, textH );
  167.  
  168.     return;
  169. }
  170.  
  171. void SetSize( short theItem )
  172. {
  173.     TextStyle    styleRec;
  174.     TEHandle    textH;
  175.  
  176.     if ( !gDocWindow )
  177.         return;
  178.         
  179.     textH = (TEHandle)GetWRefCon( gDocWindow );
  180.  
  181.     theItem -= kStM9Point;
  182.     
  183.     styleRec.tsSize = gPointSizeTable[ theItem ];
  184.     
  185.     TESetStyle( doSize, &styleRec, true, textH );
  186.     
  187.     return;
  188. }
  189.  
  190. void InitStyleMenu( void )
  191. {
  192.     MenuHandle    styleMenu;
  193.     short        i;
  194.  
  195.     styleMenu = (MenuHandle)GetResource( 'MENU', kStyleMenuID );
  196.     if ( !styleMenu ){
  197.         Gripe( "\pcannot get Style Menu Handle" );
  198.         return;
  199.     }
  200.     
  201.     for ( i = kStMBold; i < kStMDash; i++ ){
  202.         SetItemStyle( styleMenu, i, gStyleTable[ i - 1 ] );
  203.     }
  204.  
  205.     return;
  206. }
  207.  
  208. void FixMenuMarks( void )
  209. {
  210.     TextStyle    styleRec;
  211.     TEHandle    textH;
  212.     MenuHandle    fileMenu;
  213.     MenuHandle    fontMenu;
  214.     MenuHandle    styleMenu;
  215.     MenuHandle    editMenu;
  216.     short        numItems;
  217.     short        i;
  218.     short        fontNum;
  219.     short        itemSize;
  220.     short        lineHeight;
  221.     short        fontAscent;
  222.     Str255        fontName;
  223.     Str255        itemName;
  224.     short        mode;
  225.     Boolean        continuous;
  226.  
  227.     fileMenu = (MenuHandle)GetResource( 'MENU', kFileMenuID );
  228.     if ( !fileMenu )
  229.         return;
  230.  
  231.     editMenu = (MenuHandle)GetResource( 'MENU', kEditMenuID );
  232.     if ( !editMenu )
  233.         return;
  234.  
  235.     fontMenu = (MenuHandle)GetResource( 'MENU', kFontMenuID );
  236.     if ( !fontMenu )
  237.         return;
  238.  
  239.     styleMenu = (MenuHandle)GetResource( 'MENU', kStyleMenuID );
  240.     if ( !styleMenu )
  241.         return;
  242.  
  243.     DisableItem( editMenu, kEMUndo );
  244.  
  245.     if ( !gDocWindow ){
  246.         
  247.         EnableItem( fileMenu, kFMNew );
  248.         EnableItem( fileMenu, kFMOpen );
  249.         DisableItem( fileMenu, kFMClose );
  250.         DisableItem( fileMenu, kFMSave );
  251.         DisableItem( fileMenu, kFMSaveAs );
  252.         DisableItem( fileMenu, kFMPageSetup );
  253.         DisableItem( fileMenu, kFMPrint );
  254. #ifdef NEVER
  255.         /* STUB Do this differently.  Don't want to redraw menu bar while mouse is down */
  256.         DisableItem( fontMenu, 0 );                /* Disable the entire font menu */
  257.         DisableItem( styleMenu, 0 );            /* Disable the entire style menu */
  258.         DrawMenuBar();
  259. #endif
  260.         return;
  261.     }
  262.  
  263.     SetPort( gDocWindow );
  264.  
  265.     DisableItem( fileMenu, kFMNew );
  266.     DisableItem( fileMenu, kFMOpen );
  267.     EnableItem( fileMenu, kFMClose );
  268.     EnableItem( fileMenu, kFMSave );
  269.     EnableItem( fileMenu, kFMSaveAs );
  270.     EnableItem( fileMenu, kFMPageSetup );
  271.     EnableItem( fileMenu, kFMPrint );
  272. #ifdef NEVER
  273.     /* STUB Do this differently.  Don't want to redraw menu bar while mouse is down */
  274.     EnableItem( fontMenu, 0 );                /* Enable the entire font menu */
  275.     EnableItem( styleMenu, 0 );                /* Enable the entire style menu */
  276. #endif
  277.     
  278.     textH = (TEHandle)GetWRefCon( gDocWindow );
  279.  
  280.     /* Get the current font */
  281.  
  282. #ifdef NEVER    
  283.     TEGetStyle( (*textH)->selStart, &styleRec, &lineHeight, &fontAscent, textH );
  284. #endif
  285.  
  286.     styleRec.tsFont = 0;
  287.     styleRec.tsSize = 0;
  288.     styleRec.tsFace = 0;
  289.  
  290.     mode = doFont + doFace + doSize;
  291.  
  292.     /* BUG BUG BUG TEContinousStyle does not appear to work as advertised */
  293.     
  294.     continuous = TEContinuousStyle( &mode, &styleRec, textH );
  295.  
  296.     if ( mode & doFont ){
  297.         fontNum = styleRec.tsFont;
  298.         
  299.         if ( fontNum == applFont )
  300.             fontNum = 3 /*GetAppFont()*/;            /* Otherwise Geneva shows up as 1 */
  301.     
  302.         GetFontName( fontNum, fontName );
  303.     }else{
  304.         fontName[ 0 ] = '\0';
  305.     }
  306.  
  307.     numItems = CountMItems( fontMenu );
  308.     
  309.     for ( i = 1; i <= numItems; i++ ){
  310.         GetItem( fontMenu, i, itemName );
  311.         
  312.         if ( PStrCmp( itemName, fontName ) ){
  313.             CheckItem( fontMenu, i, true );
  314.         } else {
  315.             CheckItem( fontMenu, i, false );
  316.         }
  317.     }
  318.     
  319.     /* Show the real font sizes */
  320.     
  321.     for ( i = 0; i < kStMDash2 - kStM9Point; i++ ){
  322.     
  323.         itemSize = gPointSizeTable[ i ];
  324.         
  325.         if ( RealFont( fontNum, itemSize ) ){
  326.             SetItemStyle( styleMenu, i + kStM9Point, outline );
  327.         }else{
  328.             SetItemStyle( styleMenu, i + kStM9Point, 0 );
  329.         }
  330.         
  331.         if ( mode & doSize && itemSize == styleRec.tsSize ){        /* 1.0b2 MDC was fontAscent */
  332.             CheckItem( styleMenu, i + kStM9Point, true );
  333.         } else {
  334.             CheckItem( styleMenu, i + kStM9Point, false );
  335.         }
  336.     }
  337.     
  338.     /* If the styles are the same, check them all, otherwise check none */
  339.     
  340.     for ( i = kStMPlain; i <= kStMExtend; i++ ){
  341.     
  342.         if ( mode & doFace ){
  343.         
  344.             if ( gStyleTable[ i - 1 ] & styleRec.tsFace )
  345.                 CheckItem( styleMenu, i, true );        
  346.         }else{
  347.             CheckItem( styleMenu, i, false );        
  348.         }
  349.     }
  350.      
  351.     return;
  352. }
  353.  
  354.